package iso8583

import (
	"fmt"
	"strconv"
)

//NumbericField 数字类型域
type NumbericField struct {
	Field
}

//NewNumbericField 创建数字字符域
func NewNumbericField(name int, typ int, len int) *NumbericField {
	return &NumbericField{
		Field: Field{
			Name:   name,
			Type:   typ,
			Len:    len,
			PadMod: LeftPad,
		},
	}
}

//Name 获取名称
func (nf *NumbericField) Name() int {
	return nf.Field.Name
}

//ValueString 真值
func (nf *NumbericField) ValueString() string {
	return nf.Field.DataStr
}

//Format 格式化域更具情况填充域值
func (nf *NumbericField) Format() []byte {
	return nf.Data
}

//Parse 解析
func (nf *NumbericField) Parse(b []byte, pos *Position) string {
	//data := nf.Data;
	switch nf.Type {
	case FIX:
		dist := make([]byte, nf.Len)
		copy(dist, b[pos.Get():pos.Get()+nf.Len])
		pos.Add(nf.Len)
		nf.Data = dist
		nf.DataStr = string(nf.Data)
		fmt.Printf("解析域（%d）完毕：%+v\n\t", nf.Field.Name, nf)
	case LLVAR, LLLVAR:
		//获取2个字节的长度值
		len := nf.Type
		size := b[pos.Get() : pos.Get()+len]
		pos.Add(len)
		if strLen, err := strconv.Atoi(string(size)); err == nil {
			dist := make([]byte, strLen)
			copy(dist, b[pos.Get():pos.Get()+strLen])
			pos.Add(strLen)
			nf.Data = dist
			nf.DataStr = string(nf.Data)
			fmt.Printf("解析域（%d）完毕：%+v\n\t", nf.Field.Name, nf)
		} else {
			fmt.Printf("解析域出现错误：%+v\n\t", err.Error())
		}
	}
	return nf.DataStr
}
func init() {
	Register(2, NewNumbericField(2, LLVAR, 21))   //域 2 主账号 n..19(LLVAR)，2个字节的长度值＋最大19个字节（数字字符）的主账号
	Register(3, NewNumbericField(3, FIX, 6))      //域 3 交易处理码 n6，6位定长数字字符。
	Register(4, NewNumbericField(4, FIX, 12))     //域 4 交易金额n12，12位定长数字字符
	Register(5, NewNumbericField(5, FIX, 12))     //域 5 清算金额n12，12 位定长数字字符
	Register(6, NewNumbericField(6, FIX, 12))     //域 6 持卡人扣账金额n12，12 位定长数字字符
	Register(7, NewNumbericField(7, FIX, 10))     //域 7 交易传输时间n10，10位定长数字字符格式：MMDDhhmmss
	Register(9, NewNumbericField(9, FIX, 8))      //域 9 清算汇率 n8，8位定长数字字符
	Register(10, NewNumbericField(10, FIX, 8))    //域 10 持卡人扣账汇率 n8，8位定长数字字符
	Register(11, NewNumbericField(11, FIX, 6))    //域 11 系统跟踪号 n6，6位定长数字字符
	Register(12, NewNumbericField(12, FIX, 6))    //域 12 受卡方所在地时间 n6，6位定长数字字符格式：hhmmss
	Register(13, NewNumbericField(13, FIX, 4))    //域 13 受卡方所在地日期 n4，4位定长数字字符 格式：MMDD
	Register(14, NewNumbericField(14, FIX, 4))    //域 14 卡有效期 n4, 4位定长数字字符 格式：YYMM
	Register(15, NewNumbericField(15, FIX, 4))    //域 15 清算日期 n4，4位定长数字字符 格式：MMDD
	Register(16, NewNumbericField(16, FIX, 4))    //域 16 兑换日期 n4，4位定长数字字符 格式：MMDD
	Register(18, NewNumbericField(18, FIX, 4))    //域 18 商户类型 n4，4位定长数字字符
	Register(19, NewNumbericField(19, FIX, 3))    //域 19 商户国家代码 n3，3位定长数字字符
	Register(22, NewNumbericField(22, FIX, 3))    //域 22 服务点输入方式码 n3，3位定长数字字符
	Register(23, NewNumbericField(23, FIX, 3))    //域 23 卡序列号  n3，3位定长数字字符
	Register(25, NewNumbericField(25, FIX, 2))    //域 25 服务点条件码 n2，2位定长数字字符
	Register(26, NewNumbericField(26, FIX, 2))    //域 26 服务点 PIN 获取码 n2，2位定长数字字符
	Register(28, NewNumbericField(28, FIX, 9))    //X + n8，1位符号位＋8位定长数字字符
	Register(32, NewNumbericField(32, LLVAR, 13)) //域 32 受理机构标识码 an..11(LLVAR)，2个字节的长度值＋最大11个字节的受理机构标识码
	Register(33, NewNumbericField(33, LLVAR, 13)) //域 33 发送机构标识码 an..11(LLVAR)，2个字节的长度值＋最大11个字节的发送机构标识码
	Register(53, NewNumbericField(53, FIX, 16))   //域 53 安全控制信息 n16，16位定长数字字符
	Register(70, NewNumbericField(70, FIX, 3))    //域 70 n3，3位定长数字字符
	Register(90, NewNumbericField(90, FIX, 16))   //域 90 原始数据元 n16，16位定长数字字符

}
